package com.nari.ies.ne.nw.server.service.fileDataCheck.impl;

import com.nari.ies.ne.nw.server.entity.FileDataCheckEntity;
import com.nari.ies.ne.nw.server.mapper.FileDataCheckMapper;
import com.nari.ies.ne.nw.server.mapper.PlantDataMapper;
import com.nari.ies.ne.nw.server.service.fileDataCheck.IGFXBFZFileDataCheckService;
import com.nari.ies.ne.nw.server.util.DataUtil;
import com.nari.ies.ne.nw.server.util.IoUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

@Service
@Slf4j
public class GFXBFZFileDataCheckServiceImpl implements IGFXBFZFileDataCheckService {
    @Autowired
    private PlantDataMapper plantDataMapper;

    @Autowired
    private FileDataCheckMapper fileDataCheckMapper;

    @Override
    public void GFXBFZFileDataCheck(File file) {
        log.info("数据评分--------------------"+file.getName());
        FileDataCheckEntity fileDataCheckEntity;
        List<FileDataCheckEntity> dataList = new ArrayList<>();
        String plantId;//场站id
        Date forecastDate = null;//预测时间
        Date createDate = new Date();//创建时间
        String plantType;//场站类型
        String fileType;//文件类型
        String dataType;//字段类型


        // 单机信息数据评分项----------1
        // 高压侧有功功率(无数据)
        int xbPowerNoData = 0;
        // 高压侧有功功率(有数据且不合格)
        int xbPowerQualifiedNo = 0;
        // 高压侧有功功率(有数据且合格)
        int xbPowerQualifiedData = 0;

        // 单机信息数据评分项----------2
        // 理论最大功率(无数据)
        int xbTheoryNoData = 0;
        // 理论最大功率(有数据且不合格)
        int xbTheoryQualifiedNo = 0;
        // 理论最大功率(有数据且合格)
        int xbTheoryQualifiedData = 0;

        // 单机信息数据评分项----------3
        // 状态(无数据)
        int xbStateNoData = 0;
        // 状态(有数据且不合格)
        int xbStateQualifiedNo = 0;
        // 状态(有数据且合格)
        int xbStateQualifiedData = 0;

        // 单机信息数据评分项----------4
        // 所属集电线(无数据)
        int xbCollectionData = 0;
        // 所属集电线(有数据且不合格)
        int xbCollectionQualifiedNo = 0;
        // 所属集电线(有数据且合格)
        int xbCollectionQualifiedData = 0;

        String tableName = "HISDB.NW_NE_FILE_DATACHECK_GF_XBFZ";//表名

        //文件名
        String fileName = file.getName();
        // 获取场站id
        String[] fileNameArr = file.getName().split("_");
        // 文件类型
        fileType = fileNameArr[2];
        // 场站类型
        plantType = fileNameArr[0];
        // 场站标识
        String plantCode = fileNameArr[1].split("\\.")[1];
        //String nwCode = fileNameArr[0] + "_" + fileNameArr[1].split("\\.")[0] + ".";
        List<Map<String, Object>> idList = plantDataMapper.selectPlantData(plantCode);

        plantId = idList.get(0).get("ID").toString();
        if (plantId.contains("-")) {
            plantId = plantId.split("-")[0];
        }

        FileReader fr = null;
        BufferedReader br = null;
        try {
            fr = new FileReader(file);
            br = new BufferedReader(fr);
            // 行数据
            String line = "";
            // 箱变内容数据的大小
            int xbFileDataSize = 0;
            // 方阵内容数据的大小
            int fzFileDataSize = 0;
            // 区分箱变或方阵内容标识（1：箱变 2：方阵）
            int isXBOrFZ = 0;
            while ((line = br.readLine()) != null) {
                //箱变
                if (line.contains("<XB")) {
                    isXBOrFZ = 1;
                    // 获取文件的创建时间
                    forecastDate = DataUtil.queryTime(line);
                }

                // 方阵
                if (line.contains("<FZ")) {
                    isXBOrFZ = 2;
                }

                if (line.contains("#") && isXBOrFZ == 1) {
                    //文件中箱变数据量
                    xbFileDataSize++;
                    //箱变高压侧有功功率
                    if(!" ".equals(line.split("\t")[15]) && !"null".equals(line.split("\t")[15]) && !"NULL".equals(line.split("\t")[15])){
                        if (Float.parseFloat(line.split("\t")[15]) >= 0 ) {
                            xbPowerQualifiedData++;
                        }
                    }

                    //箱变理论最大有功功率
                    if(!" ".equals(line.split("\t")[23]) && !"null".equals(line.split("\t")[23]) && !"NULL".equals(line.split("\t")[23])){
                        if (Float.parseFloat(line.split("\t")[23]) > 0 ) {
                            xbTheoryQualifiedData++;
                        }
                    }

                    //箱变状态
                    //判断 并网、故障、检修、待机、正常停机、通信中断
                    if(!" ".equals(line.split("\t")[25]) && !"null".equals(line.split("\t")[25]) && !"NULL".equals(line.split("\t")[25])){
                        if (Float.parseFloat(line.split("\t")[25]) == 1 || Float.parseFloat(line.split("\t")[25]) == 2 ) {
                            xbStateQualifiedData++;
                        }
                    }

                    //箱变所属集电线
                    if(!" ".equals(line.split("\t")[30]) && !"null".equals(line.split("\t")[30]) && !"NULL".equals(line.split("\t")[30])){
                        xbCollectionQualifiedData++;
                    }

                } else if (line.contains("#") && isXBOrFZ == 2) {
                    //文件中方阵数据量
                    fzFileDataSize++;
                }
            }

            // 光伏箱变无数据量
            int xbNoDataNumber = 0;
            // 方阵无数据量
            int fzNoDataNumber = 0;


            // 根据id获取光伏箱变监测数据量
            int xbDataSize = plantDataMapper.selectXBNumber(Long.parseLong(plantId));
            // 根据id获取方阵监测数据量
            int fzDataSize = plantDataMapper.selectFZNumber(Long.parseLong(plantId));

            // 在数据库中查询箱变和方阵数量 xbDataSize fzDataSize
            // 文件中箱变和方阵数量 xbFileDataSize fzFileDataSize

            // 箱变无数据个数
            if (xbDataSize >= 0) {
                xbNoDataNumber = Math.max(xbDataSize - xbFileDataSize, 0);
            }
            // 方阵无数据个数
            if (fzDataSize >= 0) {
                fzNoDataNumber = Math.max(fzDataSize - fzFileDataSize, 0);
            }

            // 箱变高压侧有功功率
            dataType = "xbPower";
            // 高压侧有功功率(无数据)
            xbPowerNoData=xbNoDataNumber;
            // 高压侧有功功率(有数据且不合格)
            xbPowerQualifiedNo=xbFileDataSize-xbPowerQualifiedData;
            fileDataCheckEntity = DataUtil.getFileDataCheckEntity(plantId, forecastDate, createDate, plantType, fileType, dataType,
                    xbPowerNoData, xbPowerQualifiedData, xbPowerQualifiedNo);
            dataList.add(fileDataCheckEntity);

            // 理论最大功率
            dataType = "xbTheory";
            // 理论最大功率(无数据)
            xbTheoryNoData = xbNoDataNumber;
            // 理论最大功率(有数据且不合格)
            xbTheoryQualifiedNo = xbFileDataSize-xbTheoryQualifiedData;
            fileDataCheckEntity = DataUtil.getFileDataCheckEntity(plantId, forecastDate, createDate, plantType, fileType, dataType,
                    xbTheoryNoData, xbTheoryQualifiedData, xbTheoryQualifiedNo);
            dataList.add(fileDataCheckEntity);

            // 状态
            dataType = "xbState";
            // 状态(无数据)
            xbStateNoData = xbNoDataNumber;
            // 状态(有数据且不合格)
            xbStateQualifiedNo = xbFileDataSize-xbStateQualifiedData;
            fileDataCheckEntity = DataUtil.getFileDataCheckEntity(plantId, forecastDate, createDate, plantType, fileType, dataType,
                    xbStateNoData, xbStateQualifiedData, xbStateQualifiedNo);
            dataList.add(fileDataCheckEntity);


            // 所属集电线(无数据)
            dataType = "xbCollection";
            // 所属集电线(无数据)
            xbCollectionData = xbNoDataNumber;
            // 所属集电线(有数据且不合格)
            xbCollectionQualifiedNo = xbFileDataSize-xbCollectionQualifiedData;
            fileDataCheckEntity = DataUtil.getFileDataCheckEntity(plantId, forecastDate, createDate, plantType, fileType, dataType,
                    xbCollectionData, xbCollectionQualifiedData, xbCollectionQualifiedNo);
            dataList.add(fileDataCheckEntity);


            int data = fileDataCheckMapper.selectFileDataCheck(plantId, forecastDate, tableName);
            if (data == 0) {
                log.info("数据评分插入--------------"+fileName);
                fileDataCheckMapper.insertFileDataCheck(dataList, tableName);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            IoUtil.close(br);
            IoUtil.close(fr);
        }
    }
}
